home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr26 / netprog.zip / NETPROG.TAR / asyncio / aiocat.c next >
C/C++ Source or Header  |  1989-12-17  |  1KB  |  58 lines

  1. /*
  2.  * Copy standard input to standard output, using asynchronous I/O.
  3.  */
  4.  
  5. #include    <signal.h>
  6. #include    <fcntl.h>
  7.  
  8. #define    BUFFSIZE    4096
  9.  
  10. int    sigflag;
  11.  
  12. main()
  13. {
  14.     int        n;
  15.     char        buff[BUFFSIZE];
  16.     int        sigio_func();
  17.  
  18.     signal(SIGIO, sigio_func);
  19.  
  20.     if (fcntl(0, F_SETOWN, getpid()) < 0)
  21.         err_sys("F_SETOWN error");
  22.  
  23.     if (fcntl(0, F_SETFL, FASYNC) < 0)
  24.         err_sys("F_SETFL FASYNC error");
  25.  
  26.     for ( ; ; ) {
  27.         sigblock(sigmask(SIGIO));
  28.         while (sigflag == 0)
  29.             sigpause(0);        /* wait for a signal */
  30.  
  31.         /*
  32.          * We're here if (sigflag != 0).  Also, we know that the
  33.          * SIGIO signal is currently blocked.
  34.          */
  35.  
  36.         if ( (n = read(0, buff, BUFFSIZE)) > 0) {
  37.             if (write(1, buff, n) != n)
  38.                 err_sys("write error");
  39.         } else if (n < 0)
  40.             err_sys("read error");
  41.         else if (n == 0)
  42.             exit(0);        /* EOF */
  43.  
  44.         sigflag = 0;            /* turn off our flag */
  45.  
  46.         sigsetmask(0);            /* and reenable signals */
  47.     }
  48. }
  49.  
  50. int
  51. sigio_func()
  52. {
  53.     sigflag = 1;        /* just set flag and return */
  54.  
  55.     /* the 4.3BSD signal facilities leave this handler enabled
  56.        for any further SIGIO signals. */
  57. }
  58.